\section{std::complex}
定义所在头文件 <complex>，函数声明：
\begin{cpp}
template< class T >
class complex;
template<> class complex<float>;
template<> class complex<double>;
template<> class complex<long double>;
\end{cpp}
模板特化 std::complex<float>、 std::complex<double> 及 std::complex<long double> 是表示并计算复数的字面类型 (LiteralType) 。对任何其他类型，实例化模板 complex 的效果是不确定的。实现可以禁止这种特化的实例化。

成员类型：value\_type	T
成员函数：
\begin{itemize}
\item (构造函数)构造一个复数(公开成员函数)
\item operator=：赋值内容(公开成员函数)
\item real：访问复数的实部(公开成员函数)
\item imag：访问复数的虚部(公开成员函数)
\item operator+=、operator-=、operator*=、operator/=：两个复数，或一个复数与一个标量的复合赋值(公开成员函数)
\end{itemize}
非成员函数：
\begin{itemize}
\item operator+、operator-：对复数运用一元运算符(函数模板)
\item operator+、operator-、operator*、operator/：在两个复数，或一个复数与一个标量上进行复数算术运算(函数模板)
\item operator<<、operator>>：复数的序列化和反序列化(函数模板)
\item real：返回实部(函数模板)
\item imag：返回虚部(函数模板)
\item abs(std::complex)：返回复数的模(函数模板)
\item arg：返回辐角(函数模板)
\item norm：返回模(范数)的平方(函数模板)
\item conj：返回复共轭(函数模板)
\item proj：返回到黎曼球上的投影(函数模板)
\item polar：从模和辐角构造复数(函数模板)
\item 指数函数：exp(std::complex)($e^z=e^{x+iy}=e^{x}(cos(y)+isin(y))$)，以 e 为底复数的指数(函数模板)
\item log(std::complex)($log(z)=\ln(r)+i(\theta+2n\pi)$)：沿负实轴切割的复自然对数(函数模板)
\item log10(std::complex)($log10(z)=\frac{log(z)}{log(10)}$)：沿负实轴分割的复常用对数(函数模板)
\item pow(std::complex)($pow(x,y)=x^y$)：复数幂，一或两个参数可为复数(函数模板)
\item sqrt(std::complex)$sqrt(z)=\sqrt{z}$：右半平面范围中的复平方根(函数模板)
\item sin(std::complex)($sin(z) = \frac{e^{iz}-e^{-iz}}{2i}$)：计算复数的正弦（函数模板)
\item cos(std::complex)($cos(z) = \frac{e^{iz}+e^{-iz}}{2}$)：计算复数的余弦(函数模板)
\item tan(std::complex)($tan(z)=\frac{i(e^{-iz}-e^{iz})}{e^{-iz}+e^{iz}}$)：计算复数的正切(函数模板)
\item asin(std::complex)($asin(z)=acos(-z)-\frac{\pi}{2}=-i\ln(iz+\sqrt{1+z^2})$)：计算复数的反正弦(函数模板)
\item acos(std::complex)($acos(z)=\pi-acos(-z)=\frac{\pi}{2}+i\ln(iz+\sqrt{1+z^2})$)：计算复数的反余弦(函数模板)
\item atan(std::complex)($atan(z)=\frac{i}{2}(\ln(1-iz)-\ln(1+iz))$)：计算复数的反正切(函数模板)
\item sinh(std::complex)($sinh(z)=\frac{e^2-e^{-z}}{2}$)：计算复数的双曲正弦(函数模板)
\item cosh(std::complex)($cosh(z)=\frac{e^{z}+e^{-z}}{2}$)：计算复数的双曲余弦(函数模板)
\item tanh(std::complex)($tanh(z)=\frac{e^{z}-e^{-z}}{e^z+e^{-z}}$)：计算复数的双曲正切(函数模板)
\item asinh(std::complex)($asinh(z)=\frac{asin(iz)}{i}=\ln(z+\sqrt{1+z^2})$)：计算复数的反双曲正弦(函数模板)
\item acosh(std::complex)($acosh(z)=\frac{\sqrt{z-1}}{\sqrt{1-z}}acos(z)=\ln(z+\sqrt{z+1}\sqrt{z-1})$)：计算复数的反双曲余弦(函数模板)
\item atanh(std::complex)($atanh(z)=\frac{atan(iz)}{i}=\frac{\ln(1+z)-\ln(z-1)}{2}$)：计算复数的反双曲正切(函数模板)
\end{itemize}
对于任何 complex<T> 类型的对象 z ， reinterpret\_cast<T(\&)[2]>(z)[0] 为 z 的实部且 reinterpret\_cast<T(\&)[2]>(z)[1] 为 z 的虚部。


对于任何名为 p 指向 complex<T> 数组元素的指针，及任何合法下标 i ， reinterpret\_cast<T*>(p)[2*i] 等于复数 p[i] 的实部，而 reinterpret\_cast<T*>(p)[2*i + 1] 等于复数 p[i] 的虚部

此要求的目的是 C++ 复数类型与 C 语言复数类型（及其数组）的二进制兼容性，其中要求相同的对象表示。为满足数组访问的要求，实现需满足在单独且相邻的内存位置存储 std::complex 特化的实部和虚部。其非静态数据成员的可能声明包括：
\begin{itemize}
\item 数组类型 value\_type[2] ，其首元素存有实部而第二元素存有虚部（例如 Microsoft Visual Studio ）；
\item 单个 value\_type\_Complex 类型成员（封装对应的 C 语言复数类型）（例如 GNU libstdc++ ）；
\item 两个拥有相同访问权限的 value\_type 类型成员，分别存有实部和虚部（例如 LLVM libc++ ）。
\end{itemize}
实现不能添加会占用与实部和虚部冲突的存储的非静态数据成员，而且必须确保类模板特化不含任何填充。实现也必须确保对数组访问的优化问题，其中要考虑到指向 value\_type 的指针可能为 std::complex 特化的别名，对应的数组亦然。(C++11 起)

定义于内联命名空间 std::literals::complex\_literals，\href{https://zh.cppreference.com/w/cpp/numeric/complex/operator%22%22i}{operator""if}、\href{https://zh.cppreference.com/w/cpp/numeric/complex/operator%22%22i}{operator""i}、\href{https://zh.cppreference.com/w/cpp/numeric/complex/operator%22%22i}{operator""il}：表示纯虚数的std::complex字面量。其中1i表示数学上的虚部i，数据类型默认为double。1if表示同理表示的是浮点数。
\cppfile{sample/complex_simple_demo.cc}
